package com.ungs.utils;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public final class Fechas {

	public Fechas() {
	}

	/**
	 * Devuelve la fecha actual en formato dd/mm/aaaa
	 * 
	 * @return
	 */
	public static String getFechaActualString() {
		Calendar calendar = Calendar.getInstance();
		String dia = String.valueOf(calendar.get(Calendar.DATE));
		int mes = calendar.get(Calendar.MONTH);
		String anio = String.valueOf(calendar.get(Calendar.YEAR));
		String mesString = String.valueOf(mes + 1);
		if (dia.length() == 1)
			dia = "0" + dia;
		if (mes < Constantes.OCTUBRE)
			mesString = "0" + String.valueOf(mes + 1);

		String fecha = dia + "/" + mesString + "/" + anio;

		return fecha;
	}

	/**
	 * Devuelve la fecha para la base
	 * 
	 * @param fechaParam
	 * @return
	 */
	public static Date getFechaDate(String fechaParam) {
		String[] fechas = null;

		fechas = fechaParam.split("\\/");
		int dia = Integer.parseInt(fechas[0]);
		int mes = Integer.parseInt(fechas[1]) - 1;
		int anio = Integer.parseInt(fechas[2]);

		Calendar calendar = Calendar.getInstance();
		calendar.set(anio, mes, dia, 12, 0, 0);

		Date fechaParaBase = calendar.getTime();
		return fechaParaBase;
	}

	/**
	 * Devuelve la fecha para la base
	 * 
	 * @param fechaParam
	 * @return
	 */
	public static Date getFechaActualDateConHora(String fechaParam) {
		String[] fechas = null;

		fechas = fechaParam.split(":");
		int hora = Integer.parseInt(fechas[0]);
		int minuto = Integer.parseInt(fechas[1]);

		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, hora);
		calendar.set(Calendar.MINUTE, minuto);

		Date fechaParaBase = calendar.getTime();
		return fechaParaBase;
	}

	public static String getHoraString(Date fechaParam) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fechaParam);
		int hora = calendar.get(Calendar.HOUR_OF_DAY);
		int minuto = calendar.get(Calendar.MINUTE);
		String horaString = String.valueOf(hora + 1);
		String minutoString = String.valueOf(minuto);

		if (horaString.length() == 1)
			horaString = "0" + horaString;
		if (minutoString.length() == 1)
			minutoString = "0" + minutoString;

		return horaString + ":" + minutoString;
	}

	/**
	 * Devuelve la fecha pasada por parametro en formato dd/mm/aaaa
	 * 
	 * @return
	 */
	public static String getFechaString(Date fechaDate) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fechaDate);
		String dia = String.valueOf(calendar.get(Calendar.DATE));
		int mes = calendar.get(Calendar.MONTH);
		String anio = String.valueOf(calendar.get(Calendar.YEAR));
		String mesString = String.valueOf(mes + 1);
		if (dia.length() == 1)
			dia = "0" + dia;
		if (mes < Constantes.OCTUBRE)
			mesString = "0" + String.valueOf(mes + 1);

		String fecha = dia + "/" + mesString + "/" + anio;

		return fecha;
	}

	/**
	 * Devuelve la fecha pasada por parametro en formato dd/mm/aaaa
	 * 
	 * @return
	 */
	public static String getFechaStringConHora(Date fechaDate) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fechaDate);
		String dia = String.valueOf(calendar.get(Calendar.DATE));
		int mes = calendar.get(Calendar.MONTH);
		String anio = String.valueOf(calendar.get(Calendar.YEAR));
		String hora = String.valueOf(calendar.get(Calendar.HOUR));
		String minuto = String.valueOf(calendar.get(Calendar.MINUTE));
		String horaCompleta = hora + ":" + minuto;
		String mesString = String.valueOf(mes + 1);
		if (dia.length() == 1)
			dia = "0" + dia;
		if (mes < Constantes.OCTUBRE)
			mesString = "0" + String.valueOf(mes + 1);

		String fechaConHora = dia + "/" + mesString + "/" + anio + " "
				+ horaCompleta;

		return fechaConHora;
	}

	/**
	 * Devuelve la fecha actual con hora - Date
	 * 
	 * @return
	 */
	public static Date getFechaActualConHoraDate() {
		Calendar calendar = Calendar.getInstance();
		return calendar.getTime();
	}

	/**
	 * 
	 * @return
	 */
	public static String getFechaActualConHoraString() {
		Calendar calendar = Calendar.getInstance();
		String dia = String.valueOf(calendar.get(Calendar.DATE));
		String mes = String.valueOf(calendar.get(Calendar.MONTH));
		String anio = String.valueOf(calendar.get(Calendar.YEAR));
		String hora = String.valueOf(calendar.get(Calendar.HOUR_OF_DAY));
		String minuto = String.valueOf(calendar.get(Calendar.MINUTE));
		String segundo = String.valueOf(calendar.get(Calendar.SECOND));

		if (dia.length() == 1)
			dia = "0" + dia;
		if (mes.length() == 1)
			mes = "0" + mes;
		if (hora.length() == 1)
			hora = "0" + hora;
		if (minuto.length() == 1)
			minuto = "0" + minuto;
		if (segundo.length() == 1)
			segundo = "0" + segundo;

		String fecha = dia + "/" + mes + "/" + anio + "  " + hora + ":"
				+ minuto;

		return fecha;
	}

	public static boolean validarFecha(Date fechaParam) {
		Calendar calendarActual = Calendar.getInstance();
		calendarActual.set(Calendar.HOUR_OF_DAY, 0);
		calendarActual.set(Calendar.MINUTE, 1);
		calendarActual.set(Calendar.SECOND, 0);
		Calendar calendarParam = Calendar.getInstance();
		calendarParam.setTime(fechaParam);

		if (calendarActual.compareTo(calendarParam) > 0) {
			return false;
		} else {
			return true;
		}

	}

	public static String calcularTiempo(Date fechaComienzo, Date fechaCierre) {
		String diferencia = "";
		int dias = 0;
		int rangoAnyos = 0;
		int diasAnyo = 0;
		int horas = 0;
		int minutos = 0;

		/* CREAMOS EL GREGORIAN CALENDAR DE LAS DOS FECHAS */
		GregorianCalendar dateComienzo = new GregorianCalendar();
		GregorianCalendar dateCierre = new GregorianCalendar();
		dateComienzo.setTime(fechaComienzo);
		dateCierre.setTime(fechaCierre);

		/* COMPROBAMOS SI ESTAMOS EN EL MISMO ANYO */
		if (dateComienzo.get(Calendar.YEAR) == dateCierre.get(Calendar.YEAR)) {

			/* CALCULAMOS EL RANGO DE DIAS QUE HAY */
			dias = dateCierre.get(Calendar.DAY_OF_YEAR)
					- dateComienzo.get(Calendar.DAY_OF_YEAR);

			/* CALCULAMOS EL RANGO DE HORAS QUE HAY */
			horas = dateCierre.get(Calendar.HOUR_OF_DAY)
					- dateComienzo.get(Calendar.HOUR_OF_DAY);

			/* CALCULAMOS EL RANGO DE MINUTOS QUE HAY */
			minutos = dateCierre.get(Calendar.MINUTE)
					- dateComienzo.get(Calendar.MINUTE);
			
			if(minutos < 0){
				horas = horas - 1;
				minutos = 60 + minutos;
			}

		} else {
			/*
			 * SI ESTAMOS EN DISTINTO ANYO COMPROBAMOS QUE EL ANYO DEL DATEINI
			 * NO SEA BISIESTO SI ES BISIESTO SON 366 DIAS EL ANYO SINO SON 365
			 */
			diasAnyo = dateComienzo.isLeapYear(dateComienzo.get(Calendar.YEAR)) ? 366
					: 365;

			/* CALCULAMOS EL RANGO DE ANYOS */
			rangoAnyos = dateCierre.get(Calendar.YEAR)
					- dateComienzo.get(Calendar.YEAR);

			/* CALCULAMOS EL RANGO DE DIAS QUE HAY */
			dias = (rangoAnyos * diasAnyo)
					+ (dateCierre.get(Calendar.DAY_OF_YEAR) - dateComienzo
							.get(Calendar.DAY_OF_YEAR));

			/* CALCULAMOS EL RANGO DE HORAS QUE HAY */
			horas = (rangoAnyos * diasAnyo)
					+ (dateCierre.get(Calendar.HOUR_OF_DAY) - dateComienzo
							.get(Calendar.HOUR_OF_DAY));
			
			/* CALCULAMOS EL RANGO DE MINUTOS QUE HAY */
			horas = (rangoAnyos * diasAnyo)
					+ (dateCierre.get(Calendar.MINUTE) - dateComienzo
							.get(Calendar.MINUTE));

		}

		if(dias != 0){
			diferencia = dias + "dias " + horas + "hs. " +minutos + "min";
		}
		else{
			diferencia = horas + "hs. " +minutos + "min.";
		}
		
		System.out.println(diferencia);
		return diferencia;
	}

}
